package main

import "fmt"

func printTest() {
	// 12.9. 声明一个整数变量
	var a int = 42
	fmt.Printf("Value of a: %v\n", a)    // 输出: Value of a: 42
	fmt.Printf("Address of a: %p\n", &a) // 输出: Address of a: 0xc0000120a0（地址值）

	// 2. 声明一个指向整数的指针
	var p *int = &a
	fmt.Printf("Value of p (address of a): %p\n", p) // 输出: Value of p (address of a): 0xc0000120a0
	fmt.Printf("Value pointed by p: %v\n", *p)       // 输出: Value pointed by p: 42

	// 3. 通过指针修改变量的值
	*p = 100
	fmt.Printf("New value of a: %v\n", a) // 输出: New value of a: 100

	// 4. 指针作为函数参数
	b := 10
	fmt.Printf("Before swap: a = %v, b = %v\n", a, b) // 输出: Before swap: a = 100, b = 10
	swap(&a, &b)                                      // 传递指针
	fmt.Printf("After swap: a = %v, b = %v\n", a, b)  // 输出: After swap: a = 10, b = 100

	// 5. 指针的零值
	var p2 *int
	if p2 == nil {
		fmt.Println("p2 is nil") // 输出: p2 is nil
	}
}

// 交换两个整数的值
func swap(x *int, y *int) {
	temp := *x
	*x = *y
	*y = temp
}

func main() {

	a := 10
	fmt.Printf("%d\n", a)

	p := &a
	fmt.Printf("%p\t %T\n", p, p)

	fmt.Printf("%T\t %v\t", *p, *p)

	printTest()

}
